<!DOCTYPE html>
<html>
<title>Test how event handlers work with isolated Worlds</title>
<script>

// This test is meaningless without testRunner.
if (window.testRunner && window.eventSender) {

    testRunner.dumpAsText();
    testRunner.waitUntilDone();

    window.textAttributeEventsCount = 0;
    window.xhrEventsCount = 0;
    window.functionAttributeEventsCount = 0;
    window.addEventListener("message", function(message)
    {
        testRunner.notifyDone();
    }, false);

    window.textAttributeEventsCallback = function()
    {
        if (textAttributeEventsCount++)
            document.getElementById("log").innerHTML += "PASS";
    }

    function newTest(title)
    {
        document.getElementById("log").innerHTML += "<br>" + title + ": ";
    }

    function textAttributeEventListener()
    {
        window.textAttributeEventsCallback = function()
        {
            if (window.alreadyFailed)
                return;
             document.getElementById("log").innerHTML += "FAIL";
             window.alreadyFailed = true;
        }

        var test = document.getElementById("test");
        test.innerHTML = "<button id='button1' onclick='textAttributeEventsCallback()'></button>";
        document.getElementById("button1").click();
    }

    function functionAttributeEventListener()
    {
        var test = document.getElementById("test");
        var button = test.appendChild(document.createElement("button"));
        window.functionAttributeEventsCount = 0;
        button.onclick = function()
        {
            if (window.functionAttributeEventsCount++)
                document.getElementById("log").innerHTML += "PASS";
        }
        button.style.cssText = "width: 30px;height:30px";
        button.click();
    }

    function xhrEventListener()
    {
        window.xhrWorld = 1;
        var done;
        var xhr = new XMLHttpRequest();
        xhr.open("GET", "anyfile", true);
        xhr.onreadystatechange = function() {
            if (done)
                return;
            done = true;
            document.getElementById("log").innerHTML += window.xhrWorld  ? "PASS" : "FAIL";
            window.postMessage("done", "*");
        };
        xhr.send(null);
    }

    function runTestInWorld(worldId, funcName)
    {
        testRunner.evaluateScriptInIsolatedWorld(worldId, String(eval(funcName)) + "\n" + funcName + "();");
    }

    function runTest()
    {
        newTest("Text attribute event listeners should always fire in main world");

        // Clear any existing CSP or security origin for the isolated world to
        // prevent side effects from other tests.
        testRunner.setIsolatedWorldInfo(1, null, null);
        runTestInWorld(1, "textAttributeEventListener");
        var button1 = document.getElementById("button1");
        button1.click();
        button1.parentElement.removeChild(button1);

        newTest("Function attribute event listeners should fire in the world where they were created");
        runTestInWorld(1, "functionAttributeEventListener");
        var testDiv = document.getElementById("test");
        // Land somewhere on the button.
        eventSender.mouseMoveTo(testDiv.offsetLeft + 5, testDiv.offsetTop + 5);
        eventSender.mouseDown();
        eventSender.mouseUp();

        newTest("XHR attribute event listeners should fire in the world where they were created");
        runTestInWorld(1, "xhrEventListener");
    }
}
</script>
<body onload="runTest()">
    <div id="test"></div>
    <div id="log"></div>
</body>
</html>
